package com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.impl;

import java.util.ArrayList;
import java.util.HashMap;

import javax.activation.DataHandler;
import javax.annotation.Resource;
import javax.jws.WebService;
import javax.xml.ws.WebServiceContext;

import org.apache.cxf.interceptor.InInterceptors;
import org.apache.cxf.interceptor.OutInterceptors;
import org.apache.ws.security.WSUsernameTokenPrincipal;

import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.controles.ControlNodoCentral;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.modelo.opciones.ParametrosRespuesta;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.NodoCentral;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.entrada.ParametrosEnvio;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.salida.NodosArbol;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.salida.RespuestaArbol;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.salida.RespuestaDescargaReportes;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.salida.RespuestaEjecutarConsultas;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.salida.RespuestaEjecutarModificaciones;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.salida.RespuestaEnvioCorreo;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.salida.RespuestaFinal;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.salida.RespuestaGeneraReportes;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.salida.RespuestaValidarUsuario;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.util.Utiles;

@WebService(endpointInterface = "com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.servicios.NodoCentral")
@InInterceptors(interceptors = "org.apache.cxf.interceptor.LoggingInInterceptor")
@OutInterceptors(interceptors = "org.apache.cxf.interceptor.LoggingOutInterceptor")

public class NodoCentralImpl implements NodoCentral {
	private ControlNodoCentral control;
	@Resource
    WebServiceContext wsctx;

	public NodoCentralImpl(){
		control =ControlNodoCentral.getInstance();
	}
	@Override
	public RespuestaValidarUsuario validarUsuario(String ipAdress,Long tipo_acceso,String tokenReferencia) {
		WSUsernameTokenPrincipal ab =(WSUsernameTokenPrincipal) wsctx.getUserPrincipal();
		RespuestaValidarUsuario salida = new RespuestaValidarUsuario();
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();
		try {
			msgRespuesta = control.validarUsuario(ipAdress,tipo_acceso,ab.getName(),tokenReferencia);
			salida.setCodigoResultado(msgRespuesta.get("codigo").toString());
			salida.setNombreResultado(msgRespuesta.get("mensaje").toString());
			if(salida.getCodigoResultado().equals(Utiles.CORRECTO)){
				salida.setTokenLogin(msgRespuesta.get("tokenLogin").toString());
			}
		} catch (Exception e) {
			ParametrosRespuesta param =Utiles.CalculaParametro(999999);
			salida.setCodigoResultado(param.getCodigoParametroRespuesta()+"");
			salida.setNombreResultado(param.getNombreParametroRespuesta()+e.getMessage());	
		}
		return salida;
	}

	@Override
	public RespuestaEjecutarConsultas ejecutaconsulta(String MetodoRemoto) {
		RespuestaEjecutarConsultas salida = new RespuestaEjecutarConsultas();
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();
		WSUsernameTokenPrincipal usuario_sesion =(WSUsernameTokenPrincipal) wsctx.getUserPrincipal();
		try {
			msgRespuesta = control.ejecutaconsulta(usuario_sesion.getName(),MetodoRemoto);
			salida.setCodigoResultado(msgRespuesta.get("codigo").toString());
			salida.setNombreResultado(msgRespuesta.get("mensaje").toString());
			if(salida.getCodigoResultado().equals(Utiles.CORRECTO)){
				salida.setResultadoLista((ArrayList<Object>)msgRespuesta.get("query_salida"));
			}
		} catch (Exception e) {
			ParametrosRespuesta param =Utiles.CalculaParametro(999999);
			salida.setCodigoResultado(param.getCodigoParametroRespuesta()+"");
			salida.setNombreResultado(param.getNombreParametroRespuesta()+e.getMessage());	
		}
		return salida;
	}

	@Override
	public RespuestaEjecutarModificaciones ejecutamodificaciones() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public RespuestaGeneraReportes generaReportes() {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public RespuestaDescargaReportes descargaReportes() {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public RespuestaFinal invalidaToken(String tokenReferencia) {
		RespuestaFinal salida = new RespuestaFinal();
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();
		try {
			msgRespuesta = control.invalidaToken(tokenReferencia);
			salida.setCodigoResultado(msgRespuesta.get("codigo").toString());
			salida.setNombreResultado(msgRespuesta.get("mensaje").toString());
		} catch (Exception e) {
			ParametrosRespuesta param =Utiles.CalculaParametro(999999);
			salida.setCodigoResultado(param.getCodigoParametroRespuesta()+"");
			salida.setNombreResultado(param.getNombreParametroRespuesta()+e.getMessage());	
		}
		return salida;
	}
	@Override
	public RespuestaEnvioCorreo envioCorreo(ParametrosEnvio envioparam,
			String AdjuntoB64,  DataHandler AdjuntoBin,String mensaje) {
		RespuestaEnvioCorreo salida = new RespuestaEnvioCorreo();
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();
		
		try {
			msgRespuesta = control.envioCorreo(envioparam,AdjuntoB64,AdjuntoBin,mensaje);
			salida.setCodigoResultado(msgRespuesta.get("codigo").toString());
			salida.setNombreResultado(msgRespuesta.get("mensaje").toString());
		} catch (Exception e) {
			ParametrosRespuesta param =Utiles.CalculaParametro(999999);
			salida.setCodigoResultado(param.getCodigoParametroRespuesta()+"");
			salida.setNombreResultado(param.getNombreParametroRespuesta()+e.getMessage());	
		}
		return salida;
	}
	@Override
	public RespuestaArbol generaArbol(String codPadre) {
		RespuestaArbol salida = new RespuestaArbol();
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();
		
		try {
			msgRespuesta = control.generaArbol(codPadre);
			salida.setCodigoResultado(msgRespuesta.get("codigo").toString());
			salida.setNombreResultado(msgRespuesta.get("mensaje").toString());
			if(salida.getCodigoResultado().equals(Utiles.CORRECTO)){
				salida.setResultadoArbol((ArrayList<NodosArbol>)msgRespuesta.get("arbol_salida"));
			}
		} catch (Exception e) {
			ParametrosRespuesta param =Utiles.CalculaParametro(999999);
			salida.setCodigoResultado(param.getCodigoParametroRespuesta()+"");
			salida.setNombreResultado(param.getNombreParametroRespuesta()+e.getMessage());	
		}
		return salida;
	}

}
